const jwt = require("jsonwebtoken");

const { createUser, getUserInfo, updateById } = require("../service/user.service");
const { userRegisterError, updatePwdFaild } = require("../constant/err.type");

const { JWT_SECRET } = require("../config/config.default");
class UserController {
  // 注册控制器
  async register(ctx, next) {
    // 1.获取数据
    // console.log("表单请求参数: ", ctx.request.body);
    const { user_name, password } = ctx.request.body;
    // 传入的参数进行验证(确保合法性与合理性)

    // 确保user_name这一个用户唯一

    // 2.操作数据库
    try {
      const res = await createUser(user_name, password);
      console.log(res);
      // 3.返回结果
      ctx.body = {
        code: 0,
        message: "用户注册成功!",
        result: {
          id: res.id,
          user_name: res.user_name,
        },
      };
    } catch (error) {
      ctx.app.emit("error", userRegisterError, ctx);
      return;
    }
  }
  // 登录
  async login(ctx, next) {
    const { user_name } = ctx.request.body;
    //1.获取用户信息（在token的playload中，记录id，user_name，is_admin）
    try {
      //从返回结果对象中别除password属性，将剩下的属性放到res对象
      // const { password, ...res } = await getUserInfo({ user_name });
      const { ...res } = await getUserInfo({ user_name });
      ctx.body = {
        code: 0,
        message: "用户登录成功!",
        result: {
          token: jwt.sign(res, JWT_SECRET, { expiresIn: "1d" }),
        },
      };
    } catch (error) {
      console.log("用户登录失败");
    }
  }
  // 密码修改
  async updatePassword(ctx, next) {
    //1.获取数据
    const id = ctx.state.user.id; //在token信息中取出id值
    const password = ctx.request.body.password;
    const is_admin = ctx.request.body.is_admin | 0;
    const user_name = ctx.request.body.user_name | null;

    //2.操作数据库
    try {
      const flag = await updateById({ id, password, is_admin, user_name });
      if (flag) {
        ctx.body = {
          code: 0,
          message: "修改密码成功,请重新登录",
          result: "",
        };
      } else {
        ctx.app.emit("error", updatePwdFaild, ctx);
      }
    } catch (error) {
      ctx.app.emit("error", updatePwdFaild, ctx);
    }
  }
}

module.exports = new UserController();
